\chapter{抽象数据类型－信息隐藏}
\section{数据类型}

数据类型是每一种编程语言必须具有的一部分。ANSI-C具有int,double和char等。程序员很少满足于编程语言提供的数据类型，并且编程语言一般提供了根据预定义数据类型来定义新的数据类型的能力。一种简单的途径是聚合形成例如数组、结构体或者联合等。指针，按照C.A.R. Hoare所言“我们永远不可能从之恢复”，允许我们指代和操作数据以一种没有界限的复杂度。


到底什么是数据类型？我们可以从不同的方面来看。一个数据类型是一个值的集合－char具有256个不同的值，int多一点；但两者都是间隔的，并且行为或多或少的类似于数学中的整数。double具有更多的值，但是它们肯定与数学中的实数行为不同。


可选的，我们可以定义一个新的数据类型作一些值的集合，并且赋予基于它们的操作。典型的，这些值是计算机可以表示的，并且操作或多或少的反映了可用的硬件指令。ANSI-C中的int就表现不是很好：在不同的机器之间值的集合可能会不一致，并且算数右移可能具有不同的表现。


更复杂的例子并不会进展得更好。一般地我们定义一个线性表得元素作为一个结构体

\begin{lstlisting}[language=C]
	typedef struct node {
		struct node * next;
		… information …
	} node;
\end{lstlisting}